const { debug } = require("webpack");

/**
 * 
 * 1. webpack加载webpack.config.js中所有配置，此时就会 new TestPlugin()，执行插件的 constructor
 * 2. webpack 创建 compiler 对象
 * 3. 遍历所有 plugins 中插件，调用插件的 apply 方法
 * 4. 执行剩下的编译流程( 触发各个hooks事件 )
 */
class TestPlugin {
  constructor() {
    console.log("testPlugin constructor");
  }
  apply(compiler) {
    console.log("testPlugin apply");
    debugger;
    console.log(compiler);
    // 由文档可知，environment是同步钩子
    compiler.hooks.environment.tap('TestPlugin',()=>{
      console.log("TestPlugin environment ");
    })
    // 由文档可知， emit 是异步串行钩子 AsyncSeriesHook
    compiler.hooks.emit.tap('TestPlugin',(compilation)=>{
      console.log("TestPlugin emit ");
      console.log(compilation);
    })
    compiler.hooks.emit.tapAsync('TestPlugin',(compilation,callback)=>{
      setTimeout(() => {
        console.log("TestPlugin emitAsync");
        callback();
      }, 100);
    })
    compiler.hooks.emit.tapPromise('TestPlugin',(compilation,callback)=>{
      return new Promise((resolve)=>{
        setTimeout(() => {
          console.log("TestPlugin tapPromise");
          resolve();
        }, 2000);
      })
    })
    // 由文档可知， make 是异步并行钩子 AsyncParallelHook
    compiler.hooks.make.tapAsync("TestPlugin",(compilation, callback)=>{
      
      // 需要在compilation hooks触发 
      compilation.hooks.seal.tap("TestPlugin",()=>{
        console.log('seal');
      })
      
      setTimeout(() => {
        console.log('111');
        callback()
      }, 2000);
    })
    compiler.hooks.make.tapAsync("TestPlugin",(compilation, callback)=>{
      setTimeout(() => {
        console.log('222');
        callback()
      }, 2000);
    })
  }
}
module.exports = TestPlugin;